
<?php //echo $this->element('scripts/scripts_oo'); ?>
<?php 
  $this->assign('title_for_layout', 'Introdução - Orientação Objetos, Classes, Métodos, Encapsulamento, Herança');
  $this->assign('keywords_for_layout', 'Introdução Orientação objetos como desenvolver orientado a objeto, Tipos de objeto');
  $this->assign('description_for_layout', 'Introdução a orientação a objetos. Descubra o que é orientação objetos, história, Classes, Métodos, Encapsulamento, Herança, Tipos de Objetos.');
  ?>

<?php
  $this->start("referencia_bibliografica");
    echo "<p>Melo, Alexandre Altair; Nascimento, Mauricio G.F. PHP Profissional: APRENDA A DESENVOLVER SISTEMAS PROFISSIONAIS ORIENTADOS A OBJETOS COM PADRÕES DE PROJETO. Novatec Editora, 2007</p>";
    echo "<p>Martin, James; Odell, James J. Análise e Projeto Orientados a Objeto. Makron Books do Brasil Editora Ltda.</p>";
    $this->end();
?>

<article>
	<header>
		<h2>Um pouco de história - Introdução</h2>
	</header>
	<p>O conceito de orientação a objetos não é novo. Desde a década de 1960 já existiam linguagens que davam suporte a essa metodologia; contudo essas linguagens bem como a metodologia de orientação a objetos eram geralmente restritas ao meio acadêmico. Porém nos últimos anos, a indústria de software tem-se esmerado em tornar essa metodologia cada vez mais presente no cotidiano dos profissionais/estudantes do setor, seja através da criação ou evolução de linguagens de programação como Java, C++, Delphi, PHP(Efetivamente na versão 5) etc., até a criação de novas ferramentas para modelagem de sistemas onde a UML tem se destacado como padrão.</p>
	<p>A OO - orientação a objetos - é também o termo geral que inclui qualquer estilo de desenvolvimento que seja baseado no conceito de "objeto" - uma entidade que exibe características e comportamento. Essa metodologia é o refinamento de vários anos de pesquisa da indústria/academia, uma evolução da técnica de programação modular/procedural, sendo que a programação orientada a objetos - POO - se vale desta evolução para resolver problemas de modelagem de software, dividindo estes problemas não mais em módulos e rotinas para dirigir o fluxo do sistema, mas para em objetos que interagem entre si para atingir esse objetivo.</p>
	<h2>Um pouco sobre orientação a objetos</h2>
	<p>Vamos pensar então o que é desenvolver orientação a objeto? Alguns poderiam responder que é programar com classes ou criar diagramas UML. Estas respostas não estão erradas, porém o conceito é muito mais amplo. Modelar e projetar sistemas com essa metodologia é abstrair problemas da realidade cotidiana para modelos computacionais com base em padrões organizados, a base dessa modelagem é o que conhecemos como objeto.</p>
	<p>Os modelos orientados a objetos facilitam o entendimento de todo ciclo de desenvolvimento, desde a ideia do funcionamento do negócio, contato com o cliente (entrevista, levantamento de requisitos), comunicação das partes, entendimento dos processos de negócios, especificação das classes e banco de dados.</p>
</article>
<article>
	<header>
		<h2>Conceitos</h2>
	</header>
	<p>O fundamental para a tecnologia a objeto é:</p>
	<li>Objetos e classes (sendo uma classe a implementação de um tipo de objeto).</li>
	<li>Métodos.</li>
	<li>Solicitações (requests).</li>
	<li>Herança.</li>
	<li>Encapsulamento.</li>
	<p>Embora as noções que serão apresentadas sejam a base de um software orientado a objeto, elas são semelhantes às noções de base de todas as criaturas vivas.</p>
	<article>

			<header>
				<h3>O que é um objeto?</h3>
			</header>
			<p>Desde a mais tenra idade formamos conceitos. Cada conceito é uma ideia ou um entendimento pessoal que temos de nosso mundo. Os conceitos que adquirimos nos permitem dar sentido e raciocinar sobre as coisas de nosso mundo. Essas coisas as quais os conceitos se aplicam são denominadas <em>objetos</em>. Um objeto pode ser real ou abstrato, como por exemplo:</p>
			<li>Uma fatura.</li>
			<li>Uma organização.</li>
			<li>Uma tela pela qual o usuário interage.</li>
			<li>Um mecanismo em um dispositivo robótico.</li>
			<li>Um avião.</li>
			<li>Um vôo de avião.</li>
			<li>Uma reserva em um avião.</li>
			<li>Um ícone em uma tela que o usuário aponta e "abre".</li>
			<li>Um processo de atendimento de pedidos.</li>
			<li>O processo de escrever essa linha.</li>
			<p>Na análise e no projeto OO, estamos interessados no comportamento do objeto. Se tivermos construindo um software, os módulos de software OO serão baseados em tipos de objetos. O software que implementa o objeto contém as estruturas de dados e operações que expressam o comportamento do objeto. As operações são codificadas como <em>métodos</em>. A representação de software OO do objeto é dessa forma, uma coleção de tipos de dados e métodos. No software OO:</p>
			<p>Um objeto pode ser composto de outros objetos. Tais objetos, por sua vez pode ser compostos de objetos – da mesma forma que uma máquina é composta de componentes e seus componentes são compostos de outros componentes. Essa intricada estrutura permite que objetos muito complexos sejam definidos.</p>
			<blockquote>
				<p>Um <em>objeto</em> é qualquer coisa, real ou abstrata, a respeito da qual armazenamos dados e os seus métodos que o manipulam.</p>
			</blockquote>
			<header>
				<h3>O que é um tipo de objeto?</h3>
			</header>
			<p>Os conceitos que possuímos aplicam-se a tipos específicos de objetos. Por exemplo, <strong>Empregado</strong> aplica-se aos objetos que são empregados por alguma organização. Instâncias de <strong>Empregado</strong> poderiam ser Fulano da Silva, Ciclano Abreu e assim por diante. Na análise orientada a objeto, esses conceitos são denominados tipos de objeto; suas instâncias são denominadas objetos.</p>
			<blockquote>
				<span>Um <em>tipo</em> de objeto é uma categoria de objeto.</span>
				<span>Um <em>objeto</em> é uma instância de um tipo de objeto.</span>
			</blockquote>
			<p>O objeto preocupa-se tanto com os dados como com os métodos com os quais os dados são manipulados. No mundo OO, a estrutura de dados e os métodos para cada tipo de objeto são armazenados juntos. A estrutura de dados não pode ser acessada ou manipulada, execeto com os métodos que fazem parte do tipo de objeto.</p>
			<header>
				<h3>Métodos</h3>
			</header>
			<p>Os <em>métodos</em> especificam a maneira pela qual os dados de um objeto são manipulados. Os métodos de um tipo de objeto referenciam <em>somente</em> as estruturas de dados desse tipo de objeto. Eles não deve acessar diretamente  as estruturas de dados de outros tipos de objeto. Para acessar a estrutura de dados de outro objeto, eles devem enviar uma mensagem a esse objeto. O tipo de objeto empacota, num mesmo bloco, os tipos de dados e os métodos.</p>
			<p>Um objeto é, dessa forma, uma coisa, com suas propriedades representadas  pelos tipos de dados e seu comportamento representado pelos métodos.</p>
			<header>
				<h3>Encapsulamento</h3>
			</header>
			<p>O ato de empacotar ao mesmo tempo dados e métodos é denominado <em>encapsulamento</em>. O objeto esconde seus dados de outros objetos e permite que os dados sejam acessados por intermédio de seus próprios métodos. Isso é chamado de ocultação de informações <em>(information hiding) </em>. O encapsulamento protege os dados de um objeto contra quaisquer adulteração. Se todos os programas pudesse acessar os dados de qualquer maneiras que o usuário desejasse, os dados poderiam ser adulterados ou usados de forma inadequada. O encapsulamento protege os dados de objeto do uso arbitrário e não intencional.</p>
			<p>O encapsulamento oculta os detalhes de sua implementação interna aos usuários de um objeto. Os usuários entendem quais operações do objeto podem ser solicitadas, mas não conhecem os detalhes de como a operação é executada.</p>
			<blockquote>
				<p><em>Encapsulamento</em> é o resultado (ou ato) de ocultar do usuário detalhes da implementação de um objeto.</p>
			</blockquote>
			<p>O encapsulamento é importante pois ele separa a maneira que o objeto se comporta da maneira que ele é implementado. Isso permite que as implementações que usam objeto sejam modificadas sem exigir que os aplicativos que o usam também sejam modificados.</p>
			<p>É mais fácil de modificar programas usando-se encapsulamento porque um tipo de objeto é modificado uma só vez.  Se um tipo de objeto for modificado, somente os métodos e as estruturas de dados associados a esse tipo de objeto são afetados, e usualmente apenas <em>alguns</em> desses métodos e estruturas de dados são.
			O comportamento do tipo de objeto pode ser modificado e testado, independentemente de outros tipos de objetos.</p>
			<p>Um aparelho de DVD é um exemplo de objeto. Ele tem certos tipos de especificados de comportamento. Um DVP-SR320 – Sony é um tipo de objeto, e um aparelho individual poderia ser uma instância desse tipo de aparelho. Todos os aparelhos desse tipo tem os mesmos <em>métodos</em>. O DVD contém componentes complexos, sendo que muitos contêm eles mesmos, mas você não precisa saber sobre ele.</p>
			<header><h3>Mensagens</h3></header>
			<p>Para fazermos um objeto realizar alguma coisa, enviamos uma <em>Solicitação</em>. Essa faz com que uma operação seja invocada. A operação executa o método apropriado e, opcionalmente retorna uma resposta. A mensagem que constitui a solicitação contem nome do objeto, o nome da operação e, às vezes, um grupo de parâmetros.</p>
			<blockquote>
				<p>Uma solicitação <em>request</em> pede que uma operação especificada seja invocada, usando um ou mais objetos como parâmetros.</p>
			</blockquote>
			<p>Os objetos podem ser muito complexos porque contêm muitos subobjetos; estes por sua vez contêm subobjetos e assim por diante. Uma pessoa que usa o objeto não precisa conhecer sua complexibilidade interna; precisa somente saber como se comunicar com ele e como ele responde.</p>
			<p>Por exemplo, você pode comunicar-se com o seu DVD ao enviar suas solicitações pelo controle remoto. Ele reage, praticando algumas ações e exibindo respostas na TV.</p>
			<header>
				<h3>O que é uma classe?</h3>
			</header>
			<p>O termo classe refere-se à implementação de software de um tipo de objeto.</p>
			<p><em>Tipo de objeto</em> é uma noção conceitual. Ele especifica uma família de objetos sem estipular como o tipo e o objeto são implementados. Os tipos de objeto são especificados durante a análise OO. Porém quando se implementam os tipos de objetos, outros termos são usados. Nas linguagens OO, os tipos de objetos são implementados como classes.</p>
			<blockquote>
				<p>Uma <em>classe</em> é uma implementação de um tipo de objeto. Ele especifica uma estrutura de dados e os métodos operacionais permissíveis que se aplicam a cada um de seus objetos.</p>
			</blockquote>
			<p>A implementação da classe especifica a estrutura de dados para cada uma de seus objetos. Por exemplo, uma classe <strong>Empregado</strong> incluiria dados sobre isenções, cargo, salário, extensão, contato e assim por diante. Além disso, cada classe define um conjunto de operações permissíveis que permitem acesso e a modificações de dados do objeto. Uma classe <strong>Empregado</strong> poderia incluir operações, tais como contratar, promover, e mudar a extensão contato.</p>
			<header>
				<h3>Herança</h3>
			</header>
			<p>Um tipo de objeto de alto nível pode ser especializado em tipos de objeto de níveis mais baixos. Um tipo de objeto pode ter subtipos. Por exemplo, o tipo de objeto de classe <strong>Pessoa</strong> pode ter o subtipo <strong>Pessoa Civil</strong> e <strong>Militar</strong>. <strong>Pessoa Militar</strong> pode ter os subtipos <strong>Oficial</strong> e <strong>Pessoa alistada</strong>. <strong>Oficial</strong> pode ter os subtipos <strong>Tenente</strong>, <strong>Capitão</strong> e <strong>Major</strong> e também subtipos como <strong>Fuzileiro Naval</strong> ou <strong>Engenheiro</strong> e <strong>Oficial do Serviço Ativo</strong>  ou  <strong>Oficial da Reserva</strong>. Há uma hierarquia de tipos de objeto, subtipos e subtipos e assim por diante.</p>
			<p>Uma classe implementa o tipo de objeto. Uma subclasse herda as propriedades de sua classe-pai; uma subclasse herda as propriedades das subclasses e assim por diante. Uma subclasse pode <em>herdar</em> a estrutura de dados e os métodos ou alguns dos métodos, de sua superclasse.</p>
	</article>



